package com.halfsword.creativecraft.utils;

import net.minecraft.world.inventory.ContainerData;

/**
 * ContainerData写入器
 * 用于向ContainerData中顺序写入数据
 */
public class ContainerDataWriter {
    private final ContainerData data;
    private int index = 0;

    /**
     * 构造函数
     * @param data 要写入的ContainerData
     */
    public ContainerDataWriter(ContainerData data) {
        this.data = data;
    }

    /**
     * 写入一个整数值
     * @param value 整数值
     */
    public void writeInt(int value) {
        if (index >= data.getCount()) {
            throw new IndexOutOfBoundsException("试图写入超出ContainerData范围的数据: " + index + " >= " + data.getCount());
        }
        data.set(index++, value);
    }

    /**
     * 写入一个布尔值
     * @param value 布尔值
     */
    public void writeBoolean(boolean value) {
        writeInt(value ? 1 : 0);
    }

    /**
     * 写入一个字节值
     * @param value 字节值
     */
    public void writeByte(byte value) {
        writeInt(value);
    }

    /**
     * 写入一个短整型值
     * @param value 短整型值
     */
    public void writeShort(short value) {
        writeInt(value);
    }

    /**
     * 写入一个浮点值（乘以1000后存储为整数）
     * @param value 浮点值
     */
    public void writeFloat(float value) {
        writeInt((int) (value * 1000));
    }

    /**
     * 写入一个双精度浮点值（乘以1000后存储为整数）
     * @param value 双精度浮点值
     */
    public void writeDouble(double value) {
        writeInt((int) (value * 1000));
    }

    /**
     * 获取当前写入位置
     * @return 当前写入位置
     */
    public int getPosition() {
        return index;
    }

    /**
     * 设置写入位置
     * @param position 新的写入位置
     */
    public void setPosition(int position) {
        if (position < 0 || position > data.getCount()) {
            throw new IndexOutOfBoundsException("无效的写入位置: " + position);
        }
        this.index = position;
    }

    /**
     * 跳过指定数量的字段
     * @param count 要跳过的字段数量
     */
    public void skip(int count) {
        setPosition(index + count);
    }

    /**
     * 重置写入位置到开始
     */
    public void reset() {
        index = 0;
    }

    /**
     * 检查是否还有更多数据可写
     * @return 是否还有更多数据
     */
    public boolean hasMore() {
        return index < data.getCount();
    }

    /**
     * 获取剩余可写字段数量
     * @return 剩余字段数量
     */
    public int remaining() {
        return data.getCount() - index;
    }

    /**
     * 写入一个枚举值
     * @param value 枚举值
     */
    public void writeEnum(Enum<?> value) {
        writeInt(value.ordinal());
    }

    /**
     * 写入一个字符串（UTF-8编码，最多4个字符）
     * @param value 字符串
     */
    public void writeString(String value) {
        if (value == null) {
            writeInt(0);
            return;
        }

        int code = 0;
        for (int i = 0; i < Math.min(4, value.length()); i++) {
            code |= (value.charAt(i) & 0xFF) << (i * 8);
        }
        writeInt(code);
    }
}